package cn.tedu.thread;
//设计模式
//单例设计模式，是一套经过经验总结的开发过程
//
//有两种实现方式，饿汉式 懒汉式
//饿汉式更方便使用，懒汉式才是面试重点
public class Test4 {
    public static void main(String[] args) {
        Mysingleton m=Mysingleton.getMy();
        System.out.println("m = " + m);
        Mysingleton m2=Mysingleton.getMy();
        //==比较基本类型的值，比的是值本身1==2
        //==比较引用类型的值，比的是地址值
        //equals（）到底比啥？
        //--如果使用object提供的equals（）就相当于是== 比的是地址值
        //--如果重写了equals（），比的是属性值
        System.out.println(m==m2);
        //true --实现了单例，两次getmy()调用返回了同一个对象
        Runtime a=Runtime.getRuntime();
        Runtime b=Runtime.getRuntime();
        System.out.println("b = " + b);
        System.out.println(a==b);
    }
}
//饿汉式--不管你用不用，我们都会第一时间创建好--浪费内存！
class Mysingleton{
    //私有化构造方法
    private Mysingleton(){

    }
    //自己创建对象
    //加static是因为--静态资源getmy（），关联的资源必须也得是静态的--静态只能调用静态
    static private Mysingleton my=new Mysingleton();
    //设置全局访问点
    // --加static因为无法通过对象访问getmy（），只能通过类名，调用了
    public static Mysingleton getMy(){
        return my;//把my返回调用位置
    }

}
//懒汉式---面试的重点！！！
// --延迟加载，什么时候需要什么时候才会加载
// 线程安全的隐患--共享资源my，被多条语句操作--加锁牺牲效率但保证安全
class Mysingleton2{
    //私有化构造方法
    private Mysingleton2(){
    }
    //自己创建对象
    //加static是因为--静态资源getmy（），关联的资源必须也得是静态的--静态只能调用静态
    static private Mysingleton2 my;
    //设置全局访问点
    // --加static因为无法通过对象访问getmy（），只能通过类名，调用了
    synchronized public static Mysingleton2 getMy(){
        //同步代码块的锁对象可以任意，但是如果共享资源是静态的，锁对象必须是固定的类名.class
 //       synchronized (Mysingleton2.class) {
            if (my == null) {//增强了代码的健壮性
                my = new Mysingleton2();
            }
            return my;//把my返回调用位置
  //      }
    }

}
